var express = require('express');
var router = express.Router();

router.get('/employer', function(req, res) {
	console.log('cert', req.cert);

	Db.Order.find({
		employer: req.cert ? req.cert.account.phone : null
	}, {
		createTime : -1
	}, function(err, orders) {
		if (err) {
			res.send(500, err);
			return;
		}
		console.log('orders : ', orders);

		res.send(orders);
	});
});

/* 获取 */
router.get('/', function (req, res, next) {
	var limit = req.query.limit;
	var skip = req.query.skip;

	var search = {};
	var order = {};

	if (req.query.employer) {
		search.employer = req.query.employer;
	}
	if (req.query.trades) {
		if (Array.isArray(req.query.trades)) {
			search.trades = {
				$in : req.query.trades
			};
		} else {
			search.trades = req.query.trades;
		}
	}
	if (req.query.price) {
		search.price = req.query.price;
	}
	if (req.query.status) {
		search.status = req.query.status;
	}
	console.log('search : ', search);
	Db.Order.count(search, function(err, count) {
		if (err) {
			res.send(500, err);
			return;
		}

		Db.Order.find(search, {
			createTime : -1
		}, {
			limit : limit,
			skip : skip
		}, function(err, orders) {
			if (err) {
				res.send(500, err);
				return;
			}
			console.log('orders : ', orders);

			res.send({
				count : count,
				list : orders
			});
		});
	});
});
router.get('/:id', function (req, res, next) {
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			res.send(order);
		} else {
			res.send(404);
		}
	});
});

/* 下单 */
router.post('/', function (req, res, next) {
	var price = JSON.parse(req.body.price);
	var order = new Db.Order(req.body);
	// 加入雇主
	order.employer = req.cert.account.phone;
	// 校验
	var err = order.validateSync();
	if (err) {
		res.send(500, err);
		return;
	}

	// 检查状态
	var _checkStatus = function(callback) {
		Db.Order.find({
			status : {
				$nin : ['已取消', '已撤销', '已完成']
			},
			employer : req.cert.account.phone
		}, function(err, orders) {
			if (err) {
				callback(err);
				return;
			}

			callback(null, orders);
		});
	};
	// 检查余额
	var _checkBalance = function() {
		return req.cert.account.wallet && price.money * 4 <= req.cert.account.wallet.balance;
	};
	// 创建订单
	var _createOrder = function() {
		// 加入操作记录
		order.actionHistories.push({
			action : '下单',
			accountType : req.cert.type,
			accountId : req.cert.account._id
		});
		if (order.waiter) {
			order.status = '等待接单';
			order.distributionTime = new Date();
			order.actionHistories.push({
				action : '分配',
				accountType : req.cert.type,
				accountId : req.cert.account._id
			});
		} else {
			order.status = '等待分配';
		}

		order.save(function(err) {
			if (err) {
				res.send(500, err);
				return;
			}

			res.send(order);
		});
	};

	_checkStatus(function(err, orders) {
		if (err) {
			res.status(500).send(err);
			return;
		}

		if (orders && orders.length) {
			var err = new Error('还有未完成的订单。');
			res.status(500).send('还有未完成的订单。');
			return;
		}

		if (_checkBalance()) { // 创建订单
			_createOrder();
		} else {
			var err =  new Error('余额不足。');
			res.status(500).send('余额不足。');
			return;
		}
	});

});

/* 分配 */
router.put('/:id/waiter', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待分配') {
				order.invalidate('status', '当前状态无法进行该操作。', '等待接单');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}

			order.waiter = req.body.waiter;
			order.distributionTime = new Date();
			order.status = '等待接单';
			order.actionHistories.push({
				action : '分配',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 接单 */
router.put('/:id/confirmtime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待接单') {
				order.invalidate('status', '当前状态无法进行该操作。', '等待服务');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.confirmTime = new Date();
			order.status = '等待服务';
			order.actionHistories.push({
				action : '接单',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 开始服务 */
router.put('/:id/startTime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待服务') {
				order.invalidate('status', '当前状态无法进行该操作。', '开始服务');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.startTime = new Date();
			order.status = '服务中';
			order.actionHistories.push({
				action : '开始服务',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 服务完成 */
router.put('/:id/finshTime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '服务中') {
				order.invalidate('status', '当前状态无法进行该操作。', '服务完成');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.finshTime = new Date();

			// 计算支付费用
			var workTime = order.finshTime.getTime() - order.startTime.getTime();
			var workUnitNum = Math.ceil(workTime / order.price.time);
			order.paySum = order.price.value * workUnitNum;

			order.status = '等待支付';
			order.actionHistories.push({
				action : '服务完成',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 支付 */
router.put('/:id/payTime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待支付') {
				order.invalidate('status', '当前状态无法进行该操作。', '支付');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.payTime = new Date();
			order.status = '已完成';
			order.actionHistories.push({
				action : '支付',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 投诉 */
router.put('/:id/complaintTime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待支付') {
				order.invalidate('status', '当前状态无法进行该操作。', '投诉');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.complaintTime = new Date();
			order.status = '等待调解';
			order.actionHistories.push({
				action : '投诉',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 取消 */
router.put('/:id/cancelTime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待分配' && order.status != '等待接单') {
				order.invalidate('status', '当前状态无法进行该操作。', '取消');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.cancelTime = new Date();
			order.status = '已取消';
			order.actionHistories.push({
				action : '取消',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

/* 撤销 */
router.put('/:id/revokeTime', function(req, res, next) {
	var account = req.acct;
	var id = req.params.id;
	Db.Order.findById(id, function(err, order) {
		if (err) {
			res.send(500, err);
			return;
		}

		if (order) {
			if (order.status != '等待调解') {
				order.invalidate('status', '当前状态无法进行该操作。', '撤销');
				var err = order.validateSync();
				if (err) {
					res.send(400, err);
					return;
				}
			}
			order.revokeTime = new Date();
			order.status = '已撤销';
			order.actionHistories.push({
				action : '撤销',
				accountType : account.type,
				accountId : account._id
			});

			order.save(function(err) {
				if (err) {
					res.send(500, err);
					return;
				}

				res.send(order);
			});
		} else {
			res.send(404);
		}
	});
});

module.exports = router;
